#ifndef GRAPH_H
#define GRAPH_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

// 操作类型编码
typedef enum {
    OP_ALLOC = 1,
    OP_FREE = 2,
    OP_COPY_IN = 3,
    OP_MOVE = 4,
    OP_CONV = 5,
    OP_OTHER = 6
} OpCode;

// 数据类型编码
typedef enum {
    TYPE_L1 = 1,
    TYPE_UB = 2,
    TYPE_L0A = 3,
    TYPE_L0B = 4,
    TYPE_L0C = 5,
    TYPE_OTHER = 6
} TypeCode;

// 图节点结构
typedef struct {
    int id;
    OpCode op_code;
    TypeCode type_code;
    int buf_id;            // 缓冲区ID，-1表示未设置
    int size;              // 大小，0表示未设置
    char pipe[32];         // 管道名称，空字符串表示未设置
    int cycles;            // 周期数，0表示未设置
    int* bufs;             // 缓冲区引用列表
    int bufs_count;        // 缓冲区引用数量
} GraphNode;

// 图结构
typedef struct {
    int num_nodes;
    int num_edges;
    GraphNode* nodes;
    
    // 邻接表表示 (内存效率高)
    int** adj_list;         // adj_list[i] = {邻居节点列表}
    int* adj_list_sizes;    // adj_list_sizes[i] = 邻居节点数量
    
    // 邻接矩阵 (查询效率高)
    bool** adj_matrix;      // adj_matrix[i][j] = i->j是否有边
    bool** is_ancestor;     // is_ancestor[i][j] = i是否为j的祖先
    
    // 拓扑排序相关
    int* in_degrees;        // 入度数组
    int* out_degrees;       // 出度数组
} Graph;

// 调度方案结构
typedef struct {
    int* schedule;          // 调度序列
    int length;             // 调度长度
    int max_vstay;          // 峰值内存占用
    int* vstay_history;     // 内存占用历史
} Schedule;

// 优化参数结构
typedef struct {
    int iterations;         // 阶段一迭代次数
    int batch_size;         // 批处理大小
    int patience;           // 耐心值
    int max_passes;         // 阶段二最大轮数
    int time_limit_minutes; // 时间限制
    int num_threads;        // 线程数
} OptOptions;

// 函数声明

// 图操作
Graph* create_graph(int num_nodes, int num_edges);
void free_graph(Graph* g);
Graph* load_graph_from_csv(const char* nodes_file, const char* edges_file);
void add_edge(Graph* g, int from, int to);
void compute_transitive_closure(Graph* g);

// MATLAB等价函数
int* get_successors(const Graph* g, int node_id, int* count);
int* get_predecessors(const Graph* g, int node_id, int* count);
void free_node_list(int* node_list);

// 调度操作
Schedule* create_schedule(int length);
void free_schedule(Schedule* s);
Schedule* generate_initial_schedule(Graph* g);
bool is_l0_schedule_valid(const int* schedule, int length, const Graph* g);
bool is_topological_valid(const int* schedule, int length, const Graph* g);
bool is_schedule_fully_valid(const int* schedule, int length, const Graph* g);
int calculate_max_vstay(const int* schedule, int length, const Graph* g, int* history);

// 性能统计函数
void print_topological_check_stats(void);
void reset_topological_check_stats(void);

// 优化算法
Schedule* optimizer_random_sampling(const Schedule* initial, const Graph* g, const OptOptions* opts, const char* output_dir);
Schedule* optimizer_systematic_search(const Schedule* initial, const Graph* g, const OptOptions* opts, const char* output_dir);

// 工具函数
void print_graph_stats(const Graph* g);
void print_schedule_stats(const Schedule* s);
void print_transitive_closure(const Graph* g, const char* filename);
void verify_transitive_closure(const Graph* g);
double get_time_seconds(void);

#endif // GRAPH_H
